﻿using System;
using System.Diagnostics;
using System.Globalization;
using System.Runtime.InteropServices;
using System.ComponentModel.Design;
using Microsoft.Win32;
using Microsoft.VisualStudio;
using Microsoft.VisualStudio.Shell.Interop;
using Microsoft.VisualStudio.OLE.Interop;
using Microsoft.VisualStudio.Shell;
using NuGet.Enterprise.Package.Properties;
using Microsoft.VisualStudio.Project;

namespace NuGet.Enterprise.Package
{
    /// <summary>
    /// This is the class that implements the package exposed by this assembly.
    ///
    /// The minimum requirement for a class to be considered a valid package for Visual Studio
    /// is to implement the IVsPackage interface and register itself with the shell.
    /// This package uses the helper classes defined inside the Managed Package Framework (MPF)
    /// to do it: it derives from the Package class that provides the implementation of the 
    /// IVsPackage interface and uses the registration attributes defined in the framework to 
    /// register itself and its components with the shell.
    /// </summary>

    // Register project factory
    [ProvideProjectFactory(typeof(PackageProjectFactory),
    "NuGet", "NuGet Package Project Files (*.nupkgproj);*.nupkgproj",
    "nupkgproj", "nupkgproj", "", LanguageVsTemplate = "NuGet")]

    // This attribute tells the PkgDef creation utility (CreatePkgDef.exe) 
    // that this class is a package.
    [PackageRegistration(UseManagedResourcesOnly = true)]

    // This attribute is used to register the informations needed to show 
    // the this package in the Help/About dialog of Visual Studio.
    [InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)]

    [Guid(AssemblyGuids.PackageProjectPackageGuidString)]
    public sealed class PackageProjectPackage : ProjectPackage
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="PackageProjectPackage"/> class.
        /// </summary>
        public PackageProjectPackage()
        {
            Trace.WriteLine(string.Format(CultureInfo.CurrentCulture, "Entering constructor for: {0}", this.ToString()));
        }

        /// <summary>
        /// Initializes this instance.
        /// </summary>
        protected override void Initialize()
        {
            Trace.WriteLine (string.Format(CultureInfo.CurrentCulture, "Entering Initialize() of: {0}", this.ToString()));
            
            base.Initialize();

            this.RegisterProjectFactory(new PackageProjectFactory(this));
        }

        /// <summary>
        /// Gets the product user context.
        /// </summary>
        public override string ProductUserContext
        {
            get { throw new NotImplementedException(); }
        }
    }
}
